package main

import "fmt"

// 两个指针变量持有相同的内存地址，那么它们就是相等。
// 指针就是用来指向的
func main() {
	var administrator *string

	scolese := "A"
	// 将 scolese 的地址赋值给 administrator 指针
	administrator = &scolese
	// 解引用输出 administrator 指针指向的值（内容）
	fmt.Println("*administrator:", *administrator) // A
	// ===========================================================>>>

	bolden := "B"
	// 将 bolden 的地址赋值给 administrator 指针
	administrator = &bolden
	// 解引用输出 administrator 指针指向的值（内容）
	fmt.Println("*administrator:", *administrator) // B
	// ===========================================================>>>

	// 更改 bolden 的值，其实改的是 bolden 变量内存地址里面的值（内容）,
	// 而不是改了 bolden 变量的内存地址,但是在java中该操作改的就是内存地址了.
	bolden = "C"
	// 查看 administrator 指针指向的值（内容）是否改变，== 改变了==
	// administrator 指向的是 bolden 变量的内存地址
	fmt.Println("*administrator:", *administrator) // C
	// ===========================================================>>>

	// 通过解引用 修改原数据的内存地址里面的值（内容）
	// 更改 administrator 指针指向的内存地址里面的值（内容）
	*administrator = "D"
	// bolden 变量内存地址里面的值（内容）已经通过 administrator 指针改变了.
	fmt.Println("bolden", bolden) // D
	// ===========================================================>>>

	// 将 administrator 的指针赋值给 major 指针,
	// 此时 major 和 administrator 指针都是 bolden 变量的地址
	major := administrator
	// 更改 major 指针指向的内存地址里面的值（内容）
	*major = "E"
	// bolden 变量内存地址里面的值（内容）已经通过 major 指针改变了.
	fmt.Println("bolden", bolden) // E
	// 两个指针变量持有相同的内存地址，那么它们就是相等
	fmt.Println(administrator == major) // true
	// ===========================================================>>>

	lightfoot := "F"
	// 将 lightfoot 的地址赋值给 administrator 指针
	administrator = &lightfoot
	// 因为此时 administrator 指针和 major 指针指向的内存地址不一样了
	fmt.Println(administrator == major) // false
	// ===========================================================>>>

	// 将 major 指针指向的内存地址里面的值（内容）复制给 charles ,
	// charles 是一个新变量,也有自己的内存地址
	charles := *major
	// 更改 major 指针指向的内存地址里面的值（内容）,
	// 因为此时 major 指针的指向还是 bolden 变量的内存地址,
	// 所以更改也是将 bolden 变量的内存地址里面的值（内容）更改了
	*major = "G"
	fmt.Println("charles", charles) // E
	fmt.Println("bolden", bolden)   // G
	// ===========================================================>>>

	// 更改 charles 变量的内存地址里面的值（内容）
	charles = "G"
	// 因为都是 G
	fmt.Println(charles == bolden) // true
	// 但是指针指向的内存地址不一样
	fmt.Println(&charles == &bolden) // false

}
